package doing.doing_001_500;

import org.junit.Test;

import static com.study.util.LogUtil.info;

/**
 * 122. Best Time to Buy and Sell Stock II 买卖股票的最佳时机 II
 * <p>
 * 给定一个数组，它的第 i 个元素是一支给定股票第 i 天的价格。
 * 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易（多次买卖一支股票）。
 * 注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
 * <p>
 * 示例 1:
 * 输入: [7,1,5,3,6,4]
 * 输出: 7
 * 解释:
 * 在第 2 天（股票价格 = 1）的时候买入，
 * 在第 3 天（股票价格 = 5）的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
 * 随后，在第 4 天（股票价格 = 3）的时候买入，
 * 在第 5 天（股票价格 = 6）的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
 * 答案：
 * 直接贪心算法，计算当前能赚到的最大值，不断买下去
 */
@SuppressWarnings("all")
public class BestTimeToBuyAndSellStockII {

    public int maxProfit(int[] prices) {
        if (prices == null || prices.length == 0) {
            return 0;
        }

        int buy = prices[0];
        int profit = 0;

        for (int i = 1; i < prices.length; i++) {
            if (prices[i] < buy) {
                buy = prices[i];
            }

            while (prices[i] >= buy && i < prices.length - 1 && prices[i] < prices[i + 1]) {
                i++;
            }

            if (prices[i] >= buy) {
                profit += prices[i] - buy;
                i++;

                if (i < prices.length) {
                    buy = prices[i];
                }
            }
        }
        return profit;
    }

    @Test
    public void test() {
        int[] prices = new int[]{7, 1, 5, 3, 6, 4};
        info(maxProfit(prices));
    }
}










































/*
public int maxProfit(int[] prices) {
    if (prices==null || prices.length==0) {
        return 0;
    }

    int buy = prices[0];
    int profit = 0;

    for (int i=1; i<prices.length; i++) {
        if (prices[i] < buy) {
            buy = prices[i];
        }

        while (prices[i] >= buy && i < prices.length-1 && prices[i] < prices[i+1]) {
            i++;
        }

        if (prices[i] >= buy) {
            profit += prices[i] - buy;
            i++;

            if (i < prices.length) {
                buy = prices[i];
            }
        }
    }
    return profit;
}
*/

